"""
流程:
    懂车帝官网  ----  选车  ----  精美车图


显示等待:
    selenium.webdriver.support.wait.WebDriverWait
    WebDriverWait(driver, timeout).until(method)
    until:
        一直调用 method
        当 method 有所返回时 , 返回 method 的返回值 ,
        如果 method 没有返回 , 则间隔 0.5s(default value) 之后 , 再次调用 , method
        最总 时间大于 timeout 之后 , 抛出异常: TimeoutException

    presence      出现 ---->  This does not necessarily mean that the element is visible ( 源码解释 )
    visibility    可见 ( visibility 比 presence 多一个 displayed 的校验 , 出现了 , 不一定可见 )
    clickable     可点 ( clickable 比 visibility 多一个 is_enabled 的校验 , 可见了 , 不一定可点击 )


显示等待的lamdba表达式写法:
    test_oo4:
    ele = WebDriverWait(self.driver, 2).until(lambda x: x.find_element(By.XPATH, '//h2[text()="精美车图"]'))
    ele.click()

"""
import time

import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from basic.s1_pytest_base import TestBase


class TestWebDriverWait(TestBase):

    def test_oo1(self):
        """
        这里是运行不通过的 , 因为点击 选车 之后 , 会有明显的延迟 , 直接点击精美车图 , 是点击不成功的 .
        """
        self.driver.get('https://www.dongchedi.com/')
        element_select_car = self.driver.find_element(By.CSS_SELECTOR, '#sideItemWrap_select-car')
        element_select_car.click()
        element_er_shou_car = self.driver.find_element(By.XPATH, '//h2[text()="精美车图"]')
        element_er_shou_car.click()

    def test_oo2(self):
        """
        显示等待的until():
            my_custom_wait_condition(_driver)方法 , 找到元素时 , 返回True , 找不到时 , 返回 False .
            WebDriverWait(driver, timeout).until(method)中:
                如果该 method 返回 True , 则返回 , 否则继续执行 method
                最终找不到的话 , 会抛出 TimeoutException .
            也就是 until(my_custom_wait_condition) 这里没有抛异常的话 , 就表示 <精美车图> 已经可以定位到了 .

            因此后续代码可以定位到元素并点击 .

            而实际中 , 这个 my_custom_wait_condition() 是有很多内置方法的 . test_oo3 .
        """
        self.driver.get('https://www.dongchedi.com/')
        element_select_car = self.driver.find_element(By.CSS_SELECTOR, '#sideItemWrap_select-car')
        element_select_car.click()

        def my_custom_wait_condition(_driver):
            ele_s = _driver.find_element(By.XPATH, '//h2[text()="精美车图"]')
            return bool(ele_s)

        WebDriverWait(self.driver, 2).until(my_custom_wait_condition)

        element_er_shou_car = self.driver.find_element(By.XPATH, '//h2[text()="精美车图"]')
        element_er_shou_car.click()

    def test_oo3(self):
        self.driver.get('https://www.dongchedi.com/')
        element_select_car = self.driver.find_element(By.CSS_SELECTOR, '#sideItemWrap_select-car')
        element_select_car.click()
        condition_car_pickure = expected_conditions.element_to_be_clickable((By.XPATH, '//h2[text()="精美车图"]'))
        if WebDriverWait(self.driver, 2).until(condition_car_pickure):
            self.driver.find_element(By.XPATH, '//h2[text()="精美车图"]').click()

    def test_oo4(self):
        self.driver.get('https://www.dongchedi.com/')
        element_select_car = self.driver.find_element(By.CSS_SELECTOR, '#sideItemWrap_select-car')
        element_select_car.click()
        ele = WebDriverWait(self.driver, 2).until(lambda x: x.find_element(By.XPATH, '//h2[text()="精美车图"]'))
        ele.click()
        time.sleep(5)


if __name__ == '__main__':
    pytest.main(['-vs', 's3_webdriver_wait.py::TestWebDriverWait::test_oo4', '--confcutdir=../basic/'])

"""
expected_conditions:

title_is(title)    检查网页 title 是否与预期(参数中的 title)完全一致 , 参数为标题内容全部
title_contains(title)    检查网页 title 是否部分包含预期 , 参数为标题内容的一部分

presence_of_element_located(locator)    检查元素是否存在 , 这里不代表一定可见 , 参数为 locator

url_contains(url)    检查 url 是否部分包含预期 url (参数中的 url)
url_matches(url)    检查 url 是否部分包含预期的 url , 严格匹配 
url_to_be(url)    检查网页 url 是否完全与期待一致 , 完全匹配
url_changes(url)    检查网页 url 是否和预期一致 , 并非完全匹配

visibility_of_element_located(locator)    检查元素在 dom 中是否可见(出现,长宽都大于0) , 参数为 locator
visibility_of(element)    检查元素在 dom 中是否可见 , 参数为 element
presence_of_all_elements_located(locator)    检查至少一个对象出现在网页中 , 参数为 locator
visibility_of_any_elements_located(locator)    检查至少有一个元素在网页中可见 , 参数为 locator
visibility_of_all_elements_located(locator)    检查所有元素的期望在网页中可见 , 参数为 locator

text_to_be_present_in_element()    检查指定的 text 是否出现在指定的元素中
text_to_be_present_in_element_value()    检查 text 是否出现在指定元素的 value 中
text_to_be_present_in_element_attribute()    检查 text 是否出现在指定元素的指定属性中

frame_to_be_available_and_switch_to_it()    检查 frame 并切换到该 frame

invisibility_of_element_located(locator)    检查元素是否不可见或者不在 dom 中 , 参数为 locator
invisibility_of_element(element)    检查检查元素是否不可见或者不在 dom 中 , 参数为 element

element_to_be_clickable(mark)    检查元素是否可以被点击 , 参数为 locator 或者 element
staleness_of(element)    检查元素是否被移除 , 参数为 element
element_to_be_selected(element)    判断元素是否被选择 , 一般用于下拉表 . 参数是 element
element_located_to_be_selected(locator)  判断元素是否被选择 , 参数是 locator 
element_selection_state_to_be(element, is_selected)    判断 element 的选择状态与指定是否相同, 相同返回 True . 否则为False
element_located_selection_state_to_be(locator, is_selected)    和上一个一样 , 只是 element 换成了 locator .

number_of_windows_to_be(num_windows)    判断网页句柄数 , 和预期是否一致
new_window_is_opened(current_handles)    判断是否打开新的窗口 , 参数为 driver.window_handles

alert_is_present()    判断是否有警告页面 , 如果有则跳转到警告页面 . 

element_attribute_to_include()    检查元素是否具有指定属性 . 

any_of(*expected_conditions)    任何条件为 True 时
all_of(*expected_conditions)    所有条件为 True 时
none_of(*expected_conditions)    没有条件为 True 时


常用有:
    presence_of_element_located(locator)
    invisibility_of_element_located(locator)
    element_to_be_clickable(mark)

"""
